package com.cskaoyan.javase.oop3._2inner._3local._1basic;

import com.sun.org.apache.bcel.internal.generic.NEW;
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;

/**
 * 在具体讲解局部内部类的访问特点之前,先明确两个原则:
 *      1.局部内部类和外围类还是"好兄弟",互相访问不受权限限制.但是情况稍微发生了一点变化:
 *              局部内部类访问外围类还是可以正常访问的
 *              但是外围类访问局部内部类就必须在作用域内部访问,出了作用域访问不到.
 *
 *      2.外部类是肯定无法直接访问局部内部类了.
 *
 * 局部内部类的访问特点
 * 局部内部类的访问特点，我们仍然主要从以下几个角度研究：
 *      1.局部内部类内部访问外围类(重点)
 *          以外围类方法内部的局部内部类为例,要分成两种:
 *              a.成员方法内部的局部内部类
 *                  这时的局部内部类对象和成员内部类非常类似,它会持有外围类对象的引用作为自身成员变量
 *                  也就是说,在外围类成员方法中的局部内部类的成员方法中,存在两个对象:
 *                  this指向自身局部内部类对象
 *                  "外围类.this"指向外围类对象
 *                  所以这时的局部内部类,它的使用可以类比成员内部类
 *
 *              b.静态方法内部的局部内部类
 *              静态方法当中没有任何对象
 *              所以这时的局部内部类对象想要持有外围类对象也是做不到的
 *              这时的局部内部类对象不持有任何外围类对象
 *              这时的局部内部类使用
 *              可以近似当做静态内部类去使用
 *              要想访问外围类,需要创建外围类对象
 *
 *      2.外围类访问局部内部类成员
 *          只能在作用域内部访问
 *          需要在作用域内部创建对象
 *          并且不受权限限制
 *
 *      3.外部类访问局部内部类成员
 *          (不能直接访问了,访问不到了)
 *      4.局部内部类访问外部类成员(了解)
 *          正常访问,受权限限制
 *
 *
 *
 *
 * @since 09:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    public void test() {
        // 外围类成员方法中的局部内部类
        class MemberMethodInnerClazz {
            int a;
            private int b = 10;
            static final int D = 30;

            // 局部内部类中的成员方法
            public void testInner() {
                // 可以直接访问外围类成员
                System.out.println(a);
                System.out.println(b);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(EnclosedClazz.this.b);
            }

            public void testInner2(int a){
                System.out.println(a);
                System.out.println(this.a);
                System.out.println(EnclosedClazz.this.a);
            }
        }
    }

    public static void testStatic() {
        // 外围类静态成员方法中的局部内部类
        class StaticMethodInnerClazz {
            int a;
            private int b = 10;

            // 成员方法
            public void testInner(){
                // System.out.println(a);
                // System.out.println(b);
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(ec.a);
                System.out.println(ec.b);
                System.out.println(a);
                System.out.println(b);
            }
        }
        StaticMethodInnerClazz sc = new StaticMethodInnerClazz();
        System.out.println(sc.b);
    }
}